' ****** START INCLUDE UrlKey$(key$) ******
FUNCTION UrlKey$(key$)
  UrlKey$ = ""
  keyPos% = INSTR( UCASE$(UrlQueryString$), [ UCASE$(key$) + "=" ] )
  IF keyPos% THEN
      step1$ = RIGHT$( UrlQueryString$, [ LEN(UrlQueryString$) - keyPos% - LEN(key$) ] )
      step2% = INSTR(step1$, "&")
      UrlKey$ = IFF( step2%, [ LEFT$(step1$, step2% - 1 ) ], step1$)
  END IF
END FUNCTION
'  ****** END INCLUDE UrlKey$(key$) ******_TITLE "Fractals in Focus"



' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2024.09.09.00.00]) on 2025.01.19 at 01:44 (Coordinated Universal Time)
' This program by Charlie Veniot is a port and mod
' of Steve Justice's program presented in the "Fractals in Focus"
' article (page 58) in the May 1985 issue of 80micro magazine
' https://archive.org/details/80-microcomputing-magazine-1985-05/page/n59/mode/1up

autoPilot$ = UrlKey$(autoPilot)

 10 REM FRACTALS FOR THE MODEL 3/4 1-HTH HIGH RESOLUTION
 12 REM
 15 REM SCREEN PIXEL SIZES
 20 SCREEN _NEWIMAGE( 680, 220, 15 )
    DIM LCOLOR%( 1 TO 7 )
    CF = 3.14159 / 180 :  MX = 620 : MY = 240
 25 SF = 0.8
 27 CLS : w = 0 : x1 = 0 : y1 = 0 : x = 0 : y = 0 : a = 0 : b$ = "" : iCombo% = 0
    GOSUB NewColors
 30 IF iCombo% = 0 _
       THEN PRINT "Number of sides" : PRINT "  (min = 3," : PRINT "  (max = 20): ";
    IF autoPilot$ = "Y" AND iCombo% = 0 _
       THEN : S = INT( RND * 18 ) + 3 : PRINT S
       ELSE : IF iCombo% = 0 THEN INPUT ""; S
    END IF
    S = MIN( MAX( VAL( S ), 3 ), 20 )
 35 REM BEGINNING X AND Y (SCALED TO SCREEN SIZE
 40 CX = MX * 0.7 : CY = MY * 0.8 : X2 = CX : Y2 = MY + 1 - CY
 60 IF iCombo% = 0 _
       THEN PRINT "Inverse image" : PRINT "  (Y = yes," : PRINT "   C = both): ";
    IF autoPilot$ = "Y" AND iCombo% = 0 _
       THEN : I$ = MID$( "YNC", INT( RND * 3 ) + 1, 1 ) : PRINT I$
       ELSE : IF iCombo% = 0 THEN INPUT ""; I$ : I$ = UCASE$( LEFT$( I$ , 1 ) )
    END IF
 70 REM ANGLES TO TURN RIGHT AND LEFT
 80 R = -360 / S : L = R + 180
 90 IF I$ = "Y" THEN C$ = "A" : W = R : R = -L : L = -W ELSE C$ = "R"
100 A$ = C$
110 IF I$ <> "Y" THEN 140
120 A1$ = "R" : S1 = S - 2 : FOR N = 1 TO S1 : A1$ = A1$ + "L" : NEXT N : A1$ = A1$ + "R"
130 GOTO 160
140 A1$ = "L" : S1 = S - 2 : FOR N = 1 TO S1 : A1$ = A1$ + "R" : NEXT N
150 A1$ = A1$ + "L"
160 IF iCombo% = 0 _
       THEN PRINT "Number of levels" : PRINT "  (min = 1," : PRINT "   max = 6):  ";
    IF autoPilot$ = "Y" AND iCombo% = 0 _
       THEN : LE = INT( RND * IFF( S < 10, 5, 2 ) ) + 2 : PRINT LE
       ELSE : IF iCombo% = 0 THEN INPUT ""; LE
    END IF
    IF LE = 1 THEN 230
    LE = MAX(MIN( 6, VAL( LE ) ),1)
170 REM EXPAND STRING FOR MULTIPLE LEVELS
190 FOR N = 2 TO LE : LN = LEN( A$ )
200 FOR N1 = 1 TO LN : B$ = B$ + MID$( A$, N1, 1 ) + A1$ : NEXT N1
210 A$ = B$ : B$ = "" : NEXT N
230 REM SCALE SIZE OF DIAGRAM TO FIT ON SCREEN
240 LL = MX * 1.25 / ( S * 3 ^ LE )
250 REM CLEAR GRAPHICS SCREEN AND SET TO STARTING X,Y
260 PSET (X2,Y2) ' : SCREEN 0
265 REM START DRAWING FIGURE
270 FOR Z = 1 TO S
280 FOR N = 1 TO LEN( A$ )
290 B1$ = MID$( A$, N, 1 ) + A1$
300 FOR N1 = 1 TO LEN( B1$ ) : B$ = MID$( B1$, N1, 1)
310 IF B$ = "A" THEN A = A + W : GOTO 330
320 IF B$ = "L" THEN A = A + L ELSE A = A + R
330 A1 = A * CF
340 X = X + LL * COS( A1 ) : Y = Y + LL * SIN( A1 ) * SF
350 XP = INT( X ) : YP = INT( Y ) : X1 = XP + CX : Y1 = 241 - ( YP / 2 + CY ) : LINE ( X2, Y2 ) - ( X1, Y1 ), LCOLOR%( N1 )
360 X2 = X1 : Y2 = Y1
370 NEXT N1 : NEXT N : SLEEP 0.001 : NEXT Z
380 REM END OF FIGURE
    KEYCLEAR
    IF I$ = "C" AND iCombo% = 0 _
       THEN : w = 0 : x1 = 0 : y1 = 0 : x = 0 : y = 0 : a = 0 : b$ = ""
              iCombo% = 1
              I$ = "Y"
              GOTO 30
       ELSE : IF autoPilot$ = "Y" _
                 THEN : PRINT : PRINT
                        PRINT "Click/touch"
                        PRINT "the screen"
                        PRINT "and hold that"
                        PRINT "click/touch"
                        PRINT "to pause the"
                        PRINT "program."
                        SLEEP 7
                        WHILE _MOUSEBUTTON : WEND
                 ELSE : PRINT : PRINT
                        PRINT "Click/touch"
                        PRINT "the screen"
                        PRINT "to create a"
                        PRINT "new image."
                        WHILE NOT _MOUSEBUTTON : WEND
                        IF _MOUSEBUTTON THEN WHILE _MOUSEBUTTON : WEND
                        KEYCLEAR
              END IF
              GOTO 27
    END IF
END

'🟠🟠🟠 GOSUB routine

NewColors: 
    multiColor% = INT( RND * 2 ) - 1
    oneColor% = INT( RND * 62 ) + 1
    FOR I = 1 TO 7
        LCOLOR%( I ) = IFF( multiColor%, INT( RND * 63 ) + 1, oneColor% )
    NEXT I
RETURN